#ifndef ARDUINO_TIMER_H
#define ARDUINO_TIMER_H

#include <stdint.h>
#include <stdbool.h>

/**
 * 定时器模式枚举
 */
typedef enum {
    TIMER_MODE_ONE_SHOT = 0,  // 单次触发：定时结束后自动停止
    TIMER_MODE_PERIODIC       // 周期触发：定时结束后重新开始
} TimerMode;

/**
 * 定时器状态枚举
 */
typedef enum {
    TIMER_STATE_STOPPED = 0,  // 停止状态
    TIMER_STATE_RUNNING       // 运行状态
} TimerState;

/**
 * 定时器回调函数类型
 * @param user_data 用户自定义数据
 */
typedef void (*TimerCallback)(void* user_data);

/**
 * 定时器结构体（用户无需直接修改成员）
 */
typedef struct {
    struct Timer* next;        // 链表节点：用于连接多个定时器
    TimerCallback callback;    // 定时回调函数
    void* user_data;           // 用户数据
    uint32_t interval;         // 定时间隔（毫秒）
    uint32_t last_trigger;     // 上次触发时间（毫秒）
    TimerMode mode;            // 定时器模式
    TimerState state;          // 定时器状态
} Timer;

/**
 * 定时器管理器结构体（管理所有定时器）
 */
typedef struct {
    Timer* timers;             // 定时器链表头
    uint32_t (*get_tick_ms)(); // 获取系统当前毫秒数的回调（需用户实现）
} TimerManager;

/**
 * 初始化定时器管理器
 * @param manager 定时器管理器实例
 * @param get_tick_ms 获取系统毫秒数的回调函数（如返回HAL_GetTick()）
 */
void timer_manager_init(TimerManager* manager, uint32_t (*get_tick_ms)());

/**
 * 创建并初始化定时器
 * @param timer 定时器实例（需用户分配内存，建议全局/静态变量）
 * @param mode 定时模式（单次/周期）
 * @param interval 定时间隔（毫秒）
 * @param callback 回调函数
 * @param user_data 用户数据
 */
void timer_init(Timer* timer, TimerMode mode, uint32_t interval,
               TimerCallback callback, void* user_data);

/**
 * 启动定时器
 * @param manager 定时器管理器
 * @param timer 要启动的定时器
 */
void timer_start(TimerManager* manager, Timer* timer);

/**
 * 停止定时器
 * @param manager 定时器管理器
 * @param timer 要停止的定时器
 */
void timer_stop(TimerManager* manager, Timer* timer);

/**
 * 定时器处理函数（核心函数）
 * 需周期性调用（建议1-10ms一次），检查所有定时器是否超时
 * @param manager 定时器管理器
 */
void timer_process(TimerManager* manager);

#endif